package com.boom.springapp.javafxdemo.utils;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @author hhl
 * @version 1.0
 * @description
 * @date 2025/11/23 9:54
 */
public class CommonTool {

    /**
     * 解析B站URL，提取内容类型（视频、番剧剧集、番剧季度）和对应标识符（BV号、EP号、SS号）
     *
     * @param url B站URL地址或直接输入的编号（如BV1234567890、EP123456、SS12345）
     * @return Pair对象，first为内容类型（"video"/"bangumi"/"season"），second为具体编号
     * @throws IllegalArgumentException 当输入不符合任何已知格式时抛出异常
     */
    public static Pair<String, String> parseBilibiliUrl(String url) throws IllegalArgumentException {

        // 视频链接正则表达式数组：匹配标准视频页面链接或者短链
        String[] videoPatterns = {
                "bilibili\\.com/video/([A-Za-z0-9]+)",   // 标准视频页面链接，捕获BV/AU/AV编号
                "b23\\.tv/([A-Za-z0-9]+)"               // 短域名跳转链接，同样捕获编号
        };

        // 番剧剧集链接正则表达式数组：匹配番剧某一集的播放页链接
        String[] bangumiPatterns = {
                "bilibili\\.com/bangumi/play/ep(\\d+)",         // 直接指向EP的链接
                "bilibili\\.com/bangumi/play/ss\\d+.*ep(\\d+)"  // 带有SS前缀并带有ep参数的链接
        };

        // 番剧季度链接正则表达式数组：匹配整个番剧季的播放页链接
        String[] seasonPatterns = {
                "bilibili\\.com/bangumi/play/ss(\\d+)"          // 季度播放页链接，捕获SS编号
        };

        // 遍历视频链接模式进行匹配
        for (String pattern : videoPatterns) {
            Pattern p = Pattern.compile(pattern);       // 编译正则表达式
            Matcher m = p.matcher(url);                 // 创建匹配器

            if (m.find()) {                             // 找到匹配项
                String identifier = m.group(1);         // 提取第一个捕获组（即编号部分）

                // 判断是否是BV开头的有效视频编号
                if (identifier.startsWith("BV")) {
                    return new Pair<>("video", identifier); // 返回视频类型与BV号
                }
            }
        }

        // 遍历番剧剧集链接模式进行匹配
        for (String pattern : bangumiPatterns) {
            Pattern p = Pattern.compile(pattern);
            Matcher m = p.matcher(url);

            if (m.find()) {
                String epId = m.group(1);                          // 提取EP编号
                return new Pair<>("bangumi", "EP" + epId);         // 返回番剧剧集类型与EP号
            }
        }

        // 遍历番剧季度链接模式进行匹配
        for (String pattern : seasonPatterns) {
            Pattern p = Pattern.compile(pattern);
            Matcher m = p.matcher(url);

            if (m.find()) {
                String seasonId = m.group(1);                      // 提取SS编号
                return new Pair<>("season", "SS" + seasonId);      // 返回番剧季度类型与SS号
            }
        }

        // 如果以上规则都未命中，则尝试基础字符串判断
        if (url.toLowerCase().startsWith("bv")) {
            return new Pair<>("video", url);                       // 直接输入BV号的情况
        } else if (url.toLowerCase().startsWith("ep")) {
            String epId = url.replace("EP", "").replace("ep", ""); // 移除前缀后保留纯数字ID
            return new Pair<>("bangumi", "EP" + epId);             // 构造完整的EP编号返回
        } else if (url.toLowerCase().startsWith("ss")) {
            String seasonId = url.replace("SS", "").replace("ss", ""); // 同样移除前缀处理
            return new Pair<>("season", "SS" + seasonId);              // 构造完整的SS编号返回
        }

        // 所有情况都无法解析，抛出非法参数异常，并提示支持的格式
        throw new IllegalArgumentException(
                "无法识别的B站链接格式: " + url +
                        "\n支持格式：\n• BV号\n• EP号（如：EP123456）\n• SS号（如：SS12345）\n• 完整链接"
        );
    }


    /**
     * 简单的Pair类用于返回两个值
     */
    public static class Pair<T, U> {
        public final T first;
        public final U second;

        public Pair(T first, U second) {
            this.first = first;
            this.second = second;
        }

        public T getFirst() {
            return first;
        }

        public U getSecond() {
            return second;
        }

        @Override
        public String toString() {
            return "(" + first + ", " + second + ")";
        }
    }
}
